home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / pygtk / 2.0 / codegen / override.py < prev    next >
Text File  |  2006-01-20  |  7KB  |  224 lines

  1. # -*- Mode: Python; py-indent-offset: 4 -*-
  2.  
  3. # this file contains code for loading up an override file.  The override file
  4. # provides implementations of functions where the code generator could not
  5. # do its job correctly.
  6.  
  7. import fnmatch
  8. import os
  9. import re
  10. import string
  11. import sys
  12.  
  13. def class2cname(klass, method):
  14.     c_name = ''
  15.     for c in klass:
  16.         if c.isupper():
  17.             c_name += '_' + c.lower()
  18.         else:
  19.             c_name += c
  20.     return c_name[1:] + '_'  + method
  21.     
  22. import_pat = re.compile(r'\s*import\s+(\S+)\.([^\s.]+)\s+as\s+(\S+)')
  23.  
  24. class Overrides:
  25.     def __init__(self, filename=None):
  26.         self.modulename = None
  27.     self.ignores = {}
  28.     self.glob_ignores = []
  29.     self.overrides = {}
  30.         self.overridden = {}
  31.     self.kwargs = {}
  32.         self.noargs = {}
  33.         self.startlines = {}
  34.         self.override_attrs = {}
  35.         self.override_slots = {}
  36.         self.headers = ''
  37.         self.init = ''
  38.         self.imports = []
  39.         self.defines = {}
  40.         self.functions = {}
  41.     if filename:
  42.             self.handle_file(filename)
  43.  
  44.     def handle_file(self, filename):
  45.         oldpath = os.getcwd()
  46.         
  47.         fp = open(filename, 'r')
  48.         dirname = os.path.dirname(os.path.abspath(filename))
  49.  
  50.         if dirname != oldpath:
  51.             os.chdir(dirname)
  52.             
  53.     # read all the components of the file ...
  54.         bufs = []
  55.         startline = 1
  56.         lines = []
  57.         line = fp.readline()
  58.         linenum = 1
  59.         while line:
  60.             if line == '%%\n' or line == '%%':
  61.                 if lines:
  62.                     bufs.append((string.join(lines, ''), startline))
  63.                 startline = linenum + 1
  64.                 lines = []
  65.             else:
  66.                 lines.append(line)
  67.             line = fp.readline()
  68.             linenum = linenum + 1
  69.         if lines:
  70.             bufs.append((string.join(lines, ''), startline))
  71.     if not bufs: return
  72.  
  73.     for buf, startline in bufs:
  74.         self.__parse_override(buf, startline, filename)
  75.  
  76.         os.chdir(oldpath)
  77.         
  78.     def __parse_override(self, buffer, startline, filename):
  79.     pos = string.find(buffer, '\n')
  80.     if pos >= 0:
  81.         line = buffer[:pos]
  82.         rest = buffer[pos+1:]
  83.     else:
  84.         line = buffer ; rest = ''
  85.     words = string.split(line)
  86.         command = words[0]
  87.     if (command == 'ignore' or
  88.             command == 'ignore-' + sys.platform):
  89.             "ignore/ignore-platform [functions..]"
  90.         for func in words[1:]:
  91.                 self.ignores[func] = 1
  92.         for func in string.split(rest):
  93.                 self.ignores[func] = 1
  94.     elif (command == 'ignore-glob' or
  95.               command == 'ignore-glob-' + sys.platform):
  96.             "ignore-glob/ignore-glob-platform [globs..]"            
  97.         for func in words[1:]:
  98.                 self.glob_ignores.append(func)
  99.         for func in string.split(rest):
  100.         self.glob_ignores.append(func)
  101.     elif command == 'override':
  102.             "override function/method [kwargs,noargs]"
  103.         func = words[1]
  104.         if 'kwargs' in words[1:]:
  105.         self.kwargs[func] = 1
  106.             elif 'noargs' in words[1:]:
  107.         self.noargs[func] = 1
  108.         self.overrides[func] = rest
  109.             self.startlines[func] = (startline + 1, filename)
  110.         elif command == 'override-attr':
  111.             "override-slot Class.attr"
  112.             attr = words[1]
  113.             self.override_attrs[attr] = rest
  114.             self.startlines[attr] = (startline + 1, filename)
  115.         elif command == 'override-slot':
  116.             "override-slot Class.slot"
  117.             slot = words[1]
  118.             self.override_slots[slot] = rest
  119.             self.startlines[slot] = (startline + 1, filename)
  120.         elif command == 'headers':
  121.             "headers"
  122.             self.headers = '%s\n#line %d "%s"\n%s' % \
  123.                            (self.headers, startline + 1, filename, rest)
  124.         elif command == 'init':
  125.             "init"
  126.             self.init = '%s\n#line %d "%s"\n%s' % \
  127.                         (self.init, startline + 1, filename, rest)
  128.         elif command == 'modulename':
  129.             "modulename name"
  130.             self.modulename = words[1]
  131.         elif command == 'include':
  132.             "include filename"
  133.         for filename in words[1:]:
  134.                 self.handle_file(filename)
  135.         for filename in string.split(rest):
  136.                 self.handle_file(filename)
  137.         elif command == 'import':
  138.             "import module1 [\n module2, \n module3 ...]"
  139.             for line in string.split(buffer, '\n'):
  140.                 match = import_pat.match(line)
  141.                 if match:
  142.                     self.imports.append(match.groups())
  143.         elif command == 'define':
  144.             "define funcname [kwargs,noargs]"
  145.             "define Class.method [kwargs,noargs]"
  146.         func = words[1]
  147.             klass = None
  148.             if func.find('.') != -1:
  149.                 klass, func = func.split('.', 1)
  150.  
  151.                 if not self.defines.has_key(klass):
  152.                     self.defines[klass] = {}
  153.                 self.defines[klass][func] = rest
  154.             else:
  155.                 self.functions[func] = rest
  156.  
  157.         if 'kwargs' in words[1:]:
  158.         self.kwargs[func] = 1
  159.             elif 'noargs' in words[1:]:
  160.         self.noargs[func] = 1
  161.  
  162.             self.startlines[func] = (startline + 1, filename)
  163.             
  164.     def is_ignored(self, name):
  165.     if self.ignores.has_key(name):
  166.         return 1
  167.     for glob in self.glob_ignores:
  168.         if fnmatch.fnmatchcase(name, glob):
  169.         return 1
  170.     return 0
  171.     
  172.     def is_overriden(self, name):
  173.     return self.overrides.has_key(name)
  174.     
  175.     def is_already_included(self, name):
  176.         return self.overridden.has_key(name)
  177.     
  178.     def override(self, name):
  179.         self.overridden[name] = 1
  180.         return self.overrides[name]
  181.  
  182.     def define(self, klass, name):
  183.         self.overridden[class2cname(klass, name)] = 1
  184.         return self.defines[klass][name]
  185.  
  186.     def function(self, name):
  187.         return self.functions[name]
  188.         
  189.     def getstartline(self, name):
  190.         return self.startlines[name]
  191.  
  192.     def wants_kwargs(self, name):
  193.     return self.kwargs.has_key(name)
  194.     
  195.     def wants_noargs(self, name):
  196.     return self.noargs.has_key(name)
  197.     
  198.     def attr_is_overriden(self, attr):
  199.         return self.override_attrs.has_key(attr)
  200.     
  201.     def attr_override(self, attr):
  202.         return self.override_attrs[attr]
  203.     
  204.     def slot_is_overriden(self, slot):
  205.         return self.override_slots.has_key(slot)
  206.     
  207.     def slot_override(self, slot):
  208.         return self.override_slots[slot]
  209.     
  210.     def get_headers(self):
  211.         return self.headers
  212.     
  213.     def get_init(self):
  214.         return self.init
  215.     
  216.     def get_imports(self):
  217.         return self.imports
  218.  
  219.     def get_defines_for(self, klass):
  220.         return self.defines.get(klass, {})
  221.     
  222.     def get_functions(self):
  223.         return self.functions
  224.